#xlrd=xls read only
#xlwt=xls write only
#xlutils为格式转换
#文件参考:https://www.cnblogs.com/pipihaoke/p/8184618.html
import os
import time
import xlrd
import xlwt
from xlutils.copy import copy
#关于上一行，可以去查看modules中对应的xlutils.copy的内容
#关于上一行的来源:Python3.9 Module Docs-->xlutils-->tests-->Data-->本行的下一行
#示例C:\Users\...\Python\Python39\lib\site-packages\xlutils\tests

#使用xlrd中的open_workbook()函数打开.xls文件，在Python3.9 Module Docs-->xlrd首页可以找到。
#在和此.py文件同文件夹下创建一个名为'初始文件.xls'的文件。
def TrueFileNameInputWait(fileClass):
    '''
    TrueFileNameInputWait(fileClass)函数功能：
        判断和.py文件同目录下是否存在以fileClass为后缀的文件，若存在，则fileInfo['fileExistFlag']值为True，否则值为False。
    编写时间：2021-2-7 21:54
    返回值 fileInfo：
        一个字典，fileInfo={从键盘输入的文件名，该文件的文件路径，该文件是否存在的标志位}。
    传入参数 fileClass：
        一个字符串，即需要TrueFileNameInputWait处理的文件的文件后缀名。
    内部使用的函数:
        DoesFileNameHaveSuffix(FileName,Suffix)
    '''
    print('当前支持的文件格式为:',fileClass)
    fileInfo={'fileGenName':'','filePath':'','fileExistFlag':False}
    fileInfo['fileGenName']=input(f'输入需要打开的{fileClass}文件名：')

    fileInfo['fileGenName']=DoesFileNameHaveSuffix(fileInfo['fileGenName'],fileClass)
    fileInfo['filePath']='./'+fileInfo['fileGenName']
    fileInfo['fileExistFlag']=os.path.exists(fileInfo['filePath'])
    return fileInfo

def DoesFileNameHaveSuffix(FileName,Suffix, Exist=False):
    '''
    DoesFileNameHaveSuffix(FileName,Suffix)函数功能：
        添加文件的后缀名。
        即先判断文件名的后缀名Suffix是否存在，若存在则FileName字符串什么都不做；若不存在，则FileName字符串添加后缀名。
    编写时间：2021-2-7 22:18
    返回值：
        FileName，为一个字符串，即处理后的文件名。
    传入参数：
        FileName，为一个字符串，即未处理前的文件名。
        Suffix，为一个字符串，即需要添加的文件后缀名。
        Exist默认文件一开始不存在，目前该参数没用处。
    '''
    #[Start:End:Step]中的Start是一定要比End小的，放到负数中去也是一样的，故要像下面这一行这样处理。
    if(FileName[-len(Suffix):-1]==Suffix[-len(Suffix):-1]) and (FileName[-1]==Suffix[-1]):
        pass
    else:
        FileName=FileName+Suffix
    return FileName



fileNameInput=TrueFileNameInputWait('.xls')
while fileNameInput['fileExistFlag']!=True:
    print(f"不存在{fileNameInput['fileGenName']}!\n")
    fileNameInput=TrueFileNameInputWait('.xls')

#注意，f后面不能跟随\这些转义符。
workbook1=xlrd.open_workbook(rf"{fileNameInput['fileGenName']}")
print('workbook1为：',workbook1)
print('workbook1的type为：',type(workbook1))

#使用xlutils.copy中的copy函数，将xlrd文件转换为xlwt形式。
workbook1_mirror=copy(workbook1)

#使用xlwt中的xlwt.Workbook里的.get_sheet()获取xls中的Sheet1
workbook1_mirror_sheet1=workbook1_mirror.get_sheet('Sheet1')

#使用xlwt.Worksheet里的.write()对单元格里的东西进行修改。
help(xlwt.Worksheet.write)
changeCell=input('输入 行号,列号,内容:')
print('changeCell的type为：',type(changeCell))
print('changeCell为：',changeCell)


def StringSplitByCyl(Str):
    '''
    StringSplitByCyl(Str)函数功能：
        将传入的字符串以','为标准切割成列表，并返回该列表。
    编写时间：2021-2-7 19:00
    返回值 changeCellList：
        一个列表，changeCellList=[.xls行,.xls列,单元格内容]。
    传入参数 Str：
        一个字符串，带有英文逗号','的字符串。
    其余内部处理参数介绍：
        dotCount：int，计算英文','的个数。
        dotCountMax：int，规定输入的英文','的最大个数。
        markDotEnd：List，用来存放每次探测到','在字符串中的位置。
    '''
    changeCellList=[0,0,'data']
    dotCount=0
    dotCountMax=2
    #[K1]~[K4]为一个系列，关于列表的初始化。
    #[K1]如果使用List.append(...)进行增量且之后需要在if判断条件中使用到该列表的元素，最好先随便赋个初值。
    markDotEnd=[0]
    for i in range(len(Str)):
        if changeCell[i]==',':
            dotCount=dotCount+1
            print('markDotEnd=',markDotEnd)
            if dotCount==1:
                #[K2]因为之前在[K1]的地方赋了初值，所以此处第一次需要将这个第一个元素替换掉。
                markDotEnd[0]=i
                changeCellList[0]=Str[:markDotEnd[0]]
                print('changeCellList[0]=',changeCellList[0])
            elif dotCount==dotCountMax:
                #[K3]使用List.append(...)进行列表扩容。
                markDotEnd.append(i)
                changeCellList[1]=Str[markDotEnd[0]+1:markDotEnd[1]]
                print('changeCellList[1]=',changeCellList[1])
        #[K4]如果之前的markDotEnd列表不进行赋值的话，这里便会报错，会提示无此下标。
        elif (markDotEnd[-1]!='') and (i>markDotEnd[-1]):
            changeCellList[2]=Str[markDotEnd[-1]+1:]
            print('changeCellList[2]=',changeCellList[2])
    return changeCellList


changedCellList_result=StringSplitByCyl(changeCell)
print(changedCellList_result[2])
workbook1_mirror_sheet1.write(int(changedCellList_result[0]),int(changedCellList_result[1]),changedCellList_result[2])
workbook1_mirror_sheet1.write(3,0,'空白')


def IsFileNameSame(InputName,OutputName):
    '''
    IsFileNameSame(InputName,OutputName)函数功能:
        用于判断两个文件的文件名是否相同，若相同则返回True，若不同则返回False。
    编写时间:
        2021-2-8 16:52
    '''
    if InputName==OutputName:
        return True
    else:
        return False


#使用xlwt中的xlwt.Workbook里的save()来保存这个镜像.xls
help(xlwt.Workbook.save)

xlsFileOutputName=input('1.输入想要输出的文件名：')
xlsFileOutputName=DoesFileNameHaveSuffix(xlsFileOutputName,'.xls')

if IsFileNameSame(fileNameInput['fileGenName'],xlsFileOutputName)!=True:#不为重名文件
    workbook1_mirror.save(rf'{xlsFileOutputName}')
else:
    fileNeedSaveFlag=False
    x=IsFileNameSame(fileNameInput['fileGenName'],xlsFileOutputName)
    while x:#为重名文件
        getYNFromKey=input('1.有重名文件存在，是否覆盖? Y/N')
        #下方的not in 判断方式会忽略只输入回车造成的问题。
        #或的写法具体区别见2.将已存在的xls文件用xlwt改写（in 及or以及对比C语言中的或）.py
        #仅输入回车带来的问题解决方法见:2.使用ord()解决1的回车跳过循环的问题.py
        #编辑时间:2021-2-8 21:26
        #下一行的while循环用于先判断输从键盘中得到的值是否为yYNn中的一种。
        while getYNFromKey not in 'yYNn':
            print('请输入Y/N!')
            getYNFromKey=input('2.有重名文件存在，是否覆盖? Y/N')
            if getYNFromKey in 'yYNn':
                break
        if getYNFromKey in 'Nn':#不覆盖原文件
            print('getYNFromKey=',getYNFromKey,',不覆盖原文件')
            fileNeedSaveFlag=True
            xlsFileOutputName=input('2.输入想要输出的文件名：')
            xlsFileOutputName=DoesFileNameHaveSuffix(xlsFileOutputName,'.xls')
            x=IsFileNameSame(fileNameInput['fileGenName'],xlsFileOutputName)
        elif getYNFromKey in 'Yy':#覆盖原文件
            print('getYNFromKey=',getYNFromKey,'覆盖原文件')
            fileNeedSaveFlag=True
            break
    if fileNeedSaveFlag:
        workbook1_mirror.save(rf'{xlsFileOutputName}')
    else:
        print('保存失败！')


print(f"{fileNameInput['fileGenName']}文件的第 {int(changedCellList_result[0])+1} 行，第",int(changedCellList_result[1])+1,f'列，在{xlsFileOutputName}中被改为了{changedCellList_result[2]}')


